<?php
/**
 * Page gestion des profils
 * Permet l'affichage, l'ajout, la suppression et la modification d'un profil
 *
 * @category actions
 * @package administration
 *
 * @author M.CASTANHEIRO, M.MEUNIER, O.PATTE, C.PORTEMER, R.THERY-HERMAIN
 * @version 1.0
 */
class profilAction extends shAction {
    /**
     * Fonction appellée automatiquement pour toutes les requêtes de l'action
     */
    public function init() {
	$this->setTitle('Gestion des profils d\'accès');
	$this->addAriane(shRequest::link('administration'), 'Administration');
    }


    /**
     * Execute la méthode par défaut pour l'action profil
     */
    public function execute() {
	// Récupération des profils existants
	$profils = shSGBD::select ('SELECT profil.id, profil.intitule, profil.description '.
		'FROM profil ');
	$this->assign('profils', $profils);
    }

      /**
     * Permet d'ajouter un profil d'accès
     */
    public function executeCreate() {
	$this->setTitle('Ajout d\'un profil');
	$this->addAriane(shRequest::link('administration','profil'), 'Gestion des profils d\'accès');

	$formulaire = new shFormulaire;
	$formulaire->setSubmitText('Ajouter le profil');

	shField::text('Intitulé')
		->appendTo($formulaire);

	shField::textarea('Description')
		->setRequired(false)
		->appendTo($formulaire);

	// Checkbox pour les droits
	$multi = shField::multibox('Droits du profil')
		->appendTo($formulaire);

	$droits = shSGBD::select('SELECT droit.id, droit.module, droit.action, droit.request '.
				 'FROM droit '.
				 'ORDER BY droit.module, droit.action, droit.request ');

	foreach ( $droits AS $droit ) {
	    $access = $droit->module;
	    if ( !empty($droit->action) ) $access .= '/' . $droit->action;
	    if ( !empty($droit->request) ) $access .= '-' . $droit->request;
	    $multi->addOption($droit->id, $access);
	}

	$this->assign('formulaire', $formulaire);

	$formulaire->setCheck(function($formulaire) {
	    if (!$formulaire->isError()) {
		// On vérifie qu'on a pas le même intitulé qui existe
		$profil = shSGBD::selectOne('SELECT count(profil.id) as count FROM profil '.
			'WHERE intitule=:intitule'
			,
			array (':intitule'=>$formulaire->getField('Intitulé')->getValue()));
		if ($profil->count > 0) {
		    $formulaire->getField('Intitulé')->setError('L\'intitulé existe déja');
		}
	    }
	});

	$formulaire->setSubmit(function($formulaire) {
		    // On crée le nouveau profil
		    $id_profil = shSGBD::insert('INSERT INTO profil (intitule,description) VALUES (:intitule,:description)',
			    array(':intitule'=>$formulaire->getField('Intitulé')->getValue(),
			    ':description'=>$formulaire->getField('Description')->getValue()));

		    // On crée les droits associés
		    foreach ( $formulaire->getField('Droits du profil')->getValue() AS $droit) {
			shSGBD::insert('INSERT INTO droit_profil(id_droit,id_profil) '.
					'VALUES(:id_droit, :id_profil) ',
					array(':id_droit' => $droit,
					      ':id_profil' => $id_profil));
		    }

		    shAction::redirect('administration','profil');
		})
	;
    }

    /**
     * Permet de modifier l'un des profils d'accès
     * @param <integer> Identifiant du profil à supprimer
     */
    public function executeEdit($id_profil) {
	$this->setTitle('Modification d\'un profil');
	$this->addAriane(shRequest::link('administration','profil'), 'Gestion des profils d\'accès');

	// On récupère le profil
	if ( !($profil = shSGBD::selectOne(
	    'SELECT profil.id, profil.intitule, profil.description '.
	    'FROM profil '.
	    'WHERE id=? '
	    ,array($id_profil))) ) {
	    throw new Exception('Le profil demandé n\'existe pas');
	    return false;
	}

	$formulaire = new shFormulaire;
	$formulaire->setSubmitText('Modifier ce profil');

	shField::text('Intitulé')
		->setValue($profil->intitule)
		->appendTo($formulaire);

	shField::textarea('Description')
		->setValue($profil->description)
		->setRequired(false)
		->appendTo($formulaire);

	// Checkbox pour les droits
	$multi = shField::multibox('Droits du profil')
		->appendTo($formulaire);

	$droits = shSGBD::select('SELECT droit.id, droit.module, droit.action, droit.request '.
				 'FROM droit '.
				 'ORDER BY droit.module, droit.action, droit.request ');

	foreach ( $droits AS $droit ) {
	    $access = $droit->module;
	    if ( !empty($droit->action) ) $access .= '/' . $droit->action;
	    if ( !empty($droit->request) ) $access .= '-' . $droit->request;
	    $multi->addOption($droit->id, $access);
	}

	// droits déjà sélectionnés
	$droits = shSGBD::select('SELECT id_droit '.
				 'FROM droit_profil '.
				 'WHERE id_profil=?',
				 array($profil->id));

	$droitsSelectionnes = array();
	foreach ( $droits AS $droit ) {
	    $droitsSelectionnes[] = $droit->id_droit;
	}
	$multi->setValue($droitsSelectionnes);

	$formulaire->setCheck(function($formulaire) use ($profil) {
		    if (!$formulaire->isError()) {
			// On vérifie qu'on a pas le même intitulé qui existe
			$profil = shSGBD::selectOne('SELECT count(profil.id) AS count '.
				'FROM profil '.
				'WHERE intitule=:intitule AND id!=:id ',
				array (':intitule'=>$formulaire->getField('Intitulé')->getValue(),
				':id'=>$profil->id));
			if ($profil->count > 0) {
			    $formulaire->getField('Intitulé')->setError('Un autre profil possède le même intitulé');
			}
		    }
		})
	;

	$formulaire->setSubmit(function($formulaire) use ($profil) {
		    // On crée le nouveau profil
		    shSGBD::update('UPDATE profil SET intitule=:intitule, description=:description '.
			    'WHERE id=:id',
			    array( ':intitule' => $formulaire->getField('Intitulé')->getValue(),
			    ':description' => $formulaire->getField('Description')->getValue(),
			    ':id' => $profil->id));

		    // On supprime les droits associés
		    shSGBD::delete('DELETE FROM droit_profil '.
				   'WHERE id_profil=? ',
				   array($profil->id));

		    // On recrée les droits associés
		    foreach ( $formulaire->getField('Droits du profil')->getValue() AS $droit) {
			shSGBD::insert('INSERT INTO droit_profil(id_droit,id_profil) '.
					'VALUES(:id_droit, :id_profil) ',
					array(':id_droit' => $droit,
					      ':id_profil' => $profil->id));
		    }


		    shAction::redirect('administration','profil');
		})
	;

	$this->assign('formulaire', $formulaire);
    }


  

    /**
     * Permet de supprimer un profil d'accès
     * @param <integer> Identifiant du profil à supprimer
     * @todo Checker toutes les dépendances en cas de suppression
     */
    public function executeDelete($id_profil) {
	$this->setTitle('Suppression d \'un profil');
	$this->addAriane(shRequest::link('administration','profil'), 'Gestion des profils d\'accès');

	// Suppression des dépendances
	shSGBD::delete(
	    'DELETE FROM droit_profil '.
	    'WHERE id_profil=? ',
	    array($id_profil)
	);

	// Suppression du profil
	shSGBD::delete(
	    'DELETE FROM profil '.
	    'WHERE id=? ',
	    array($id_profil)
	);

	shAction::redirect('administration', 'profil');
    }

}
?>